package com.ymx.darling.executor.mapping.relation.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 定义多对多关系的注解
 * 用于标记在实体类中用于表示多对多关系的字段
 * 该注解提供了关于如何通过中间表来获取相关记录的信息
 *
 * @author 爱Java的小于
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RelationManyToMany {
    /**
     * 指定查询时选择的列名数组
     * 默认为空数组，表示选择所有列
     *
     * @return 字符串数组，包含查询时选择的列名
     */
    String[] selectColumns() default {};

    /**
     * 指定本方实体类的字段名，该字段用于和中间表关联
     * 默认为空字符串 则获取本类型id字段
     *
     * @return 字符串，表示本方实体类的关联字段名
     */
    String selfField() default "";

    /**
     * 指定中间表的名称
     * 这是多对多关系中的关键信息，用于连接本方和对方实体
     *
     * @return 字符串，表示中间表的名称
     */
    String joinTable();

    /**
     * 指定中间表中连接本方实体的字段名
     *
     * @return 字符串，表示中间表中连接本方实体的字段名
     */
    String joinSelfColumn();

    /**
     * 指定中间表中连接对方实体的字段名
     *
     * @return 字符串，表示中间表中连接对方实体的字段名
     */
    String joinTargetColumn();

    /**
     * 指定对方实体类的字段名，该字段用于和中间表关联
     * 默认为空字符串 则获取对方类型id字段
     *
     * @return 字符串，表示对方实体类的关联字段名
     */
    String targetField() default "";

    /**
     * 指定额外的查询条件
     * 默认为空字符串
     *
     * @return 字符串，表示额外的查询条件
     */
    String condition() default "";

    /**
     * 指定查询结果的排序规则
     * 默认为空字符串，表示不排序
     *
     * @return 字符串，表示查询结果的排序规则
     */
    String orderBy() default "";

    /**
     * 目标表实体类
     * @return Class
     */
    Class<?> targetClass() default Void.class;
}

